General-Purpose Modules and Deeper
タイトルのうまい訳を考えられなかった…radish-miyazaki.icon
インタフェースを汎用的(general-purpose)にするか専門的(special-purpose)にするか
モジュール設計時に、抽象化したインタフェースを実現する上で直面する問題
筆者の経験則では、モジュールのインタフェースは「ある程度汎用的に作る」のがベスト
いいとこ取り
「ある程度汎用的」: 機能は現在のニーズを満たしているが、インタフェースはそうである必要はないということ
「ある程度」といのがミソ
汎用的すぎると、現在のニーズを満たすことができない
汎用的なインタフェースの利点
汎用的な方が、シンプルで深いインタフェースになる(Deep Module)
インタフェースがシンプルだと知っておくべき情報が少なくて済むので、認知的負荷も軽減できる
再利用性 も高い
ソフトウェア設計で重要な要素のひとつは、誰が何を・いつ知る必要があるかを決めることである
詳細が重要である場合、それをできるだけ明示的かつ明確にするのが良い
このような情報をインタフェースに隠すのは、かえって不明瞭さを生み出す
The Nature Of Complexity#657d0d8e75d04f0000a03341
汎用的なインタフェース と 専用的なインタフェース の正しいバランスを見つける方法
自問自答
現在のニーズをすべて満足する、最もシンプルなインタフェースはなにか?
たとえばモジュール全体の機能を低下させることなくメソッド数を減らすならば、汎用的なメソッドを作成することになる
ただし、メソッドの数を減らすのに意味があるのは、個々のメソッドがシンプルな場合においてのみ
メソッドに引数を追加する必要がある場合などは、これに当てはまらない
どのような場面で使われるか?
メソッドが特定の用途でしか使われないならば、それは汎用的ではない
いくつかのメソッドを、1つの汎用メソッドで置き換えることができないか考える
現在のニーズを満たすために、そのインタフェースは簡単に使えるか?
インタフェースがあまりにもシンプルで汎用的でないか
ニーズを満たすために多くの追加コードを書かなければならない場合、それは汎用的すぎる
hr.icon
要約
汎用的なインタフェースは、専門的なインタフェースよりも多くの利点がある
シンプルで、深いメソッドが少ない傾向にある
クラス間の関係も明確
専門的なインタフェースだと、クラス間でInformation Leakageが発生しやすい
必要な情報がインタフェースに現れないので、不明瞭が増大するためradish-miyazaki.icon
モジュールをある程度汎用的なものにすることは、システム全体の複雑さを軽減するベストプラクティスの1つ
#読書メモ